const sqlite3 = require('sqlite3').verbose();
const path = require('path');

// 数据库路径
const dbPath = path.join(__dirname, 'database.db');

// 连接数据库
const db = new sqlite3.Database(dbPath, (err) => {
  if (err) {
    console.error('Error opening database:', err.message);
    return;
  }
  console.log('Connected to SQLite database.');
});

// 修复数据类型
function fixDataTypes() {
  console.log('正在修复数据类型字段...');
  
  // 查看当前数据
  db.all(
    `SELECT id, sequence_number, start_addr, data_type, variable, description 
     FROM config_data 
     WHERE CAST(start_addr AS INTEGER) >= 1000 
     ORDER BY CAST(start_addr AS INTEGER)`,
    (err, rows) => {
      if (err) {
        console.error('查询失败:', err.message);
        return;
      }
      
      console.log('\n修复前的数据:');
      console.table(rows);
      
      // 定义地址对应的数据类型
      const addressTypeMap = {
        '1000': '4', // 32位浮点数
        '1002': '4', // 32位浮点数
        '1004': '4', // 32位浮点数
        '1006': '4', // 32位浮点数
        '1008': '4', // 32位浮点数
        '1010': '4', // 32位浮点数
        '1012': '4', // 32位浮点数
        '1014': '4', // 32位浮点数
        '1020': '2', // 16位无符号整数
        '1021': '2', // 16位无符号整数
        '1022': '2', // 16位无符号整数
        '1023': '2'  // 16位无符号整数
      };
      
      // 更新数据类型
      const updatePromises = rows.map((row) => {
        return new Promise((resolve, reject) => {
          const correctType = addressTypeMap[row.start_addr];
          if (correctType) {
            db.run(
              `UPDATE config_data SET data_type = ? WHERE id = ?`,
              [correctType, row.id],
              function(err) {
                if (err) {
                  reject(err);
                } else {
                  console.log(`已修复记录 ID ${row.id}: 地址 ${row.start_addr} -> 类型 ${correctType}`);
                  resolve();
                }
              }
            );
          } else {
            console.log(`跳过未知地址: ${row.start_addr}`);
            resolve();
          }
        });
      });
      
      // 等待所有更新完成
      Promise.all(updatePromises)
        .then(() => {
          console.log('\n数据类型修复完成，查看修复后的数据:');
          
          // 查看修复后的数据
          db.all(
            `SELECT id, sequence_number, start_addr, data_type, variable, description, note 
             FROM config_data 
             WHERE CAST(start_addr AS INTEGER) >= 1000 
             ORDER BY CAST(start_addr AS INTEGER)`,
            (err, updatedRows) => {
              if (err) {
                console.error('查询修复后数据失败:', err.message);
              } else {
                console.table(updatedRows);
                console.log(`\n成功修复了 ${updatedRows.length} 条记录的数据类型`);
              }
              
              db.close((err) => {
                if (err) {
                  console.error('关闭数据库失败:', err.message);
                } else {
                  console.log('数据库连接已关闭');
                }
              });
            }
          );
        })
        .catch((err) => {
          console.error('修复失败:', err.message);
          db.close();
        });
    }
  );
}

// 执行修复
fixDataTypes();